module Gateway (Gateway, nuevoG, numeroG, triviasG, comandosG,
        agregarTriviaG, procesarComandoG, procesarMensajeG, seAnotanEnTodasG)

where

import Tipos
import SMS
import Trivia

data Gateway = CrearG Numero [Keyword] | AgregarTrivia Trivia Gateway deriving (Show)

-- Funciones generales --  

nuevoG :: Numero -> [Keyword] -> Gateway
nuevoG numero keywords = CrearG numero keywords

numeroG :: Gateway -> Numero
numeroG (CrearG numero _) = numero
numeroG (AgregarTrivia _ gateway) = numeroG gateway

triviasG :: Gateway -> [Trivia]
triviasG (CrearG n ks) = []
triviasG (AgregarTrivia trivia gateway) = trivia : (triviasG gateway)

comandosG :: Gateway -> [Keyword]
comandosG (CrearG _ keywords) = keywords
comandosG (AgregarTrivia _ gateway) = comandosG gateway

agregarTriviaG :: Trivia -> Gateway -> Gateway
agregarTriviaG trivia gateway = AgregarTrivia trivia gateway

-- Fin funciones generales -- 

-- ProcesarComandoG -- 

procesarComandoG :: Gateway -> Usuario -> SMS -> (Gateway,SMS)
procesarComandoG gateway usuario sms | not(esComando (textoSMS sms) gateway) =
        (gateway,(nuevoSMS usuario "No te entiendo"))
                                     | not(encuentraTriviaAdecuada
        (textoSMS sms) gateway usuario) = (gateway,(nuevoSMS usuario "No te entiendo"))
                                     | damePalabra (textoSMS sms) == "RANKING" =
        (gateway,(nuevoSMS usuario (mensajeRanking (textoSMS sms) gateway usuario)))
                                     | damePalabra (textoSMS sms) == "BAJA" =
        (gatewayBaja gateway usuario (textoSMS sms),
        (nuevoSMS usuario "Listo, ya te borramos"))
                                     
esComando :: String -> Gateway -> Bool
esComando texto gateway = (damePalabra texto) `elem` (comandosG gateway) &&
        (damePalabra texto) `elem` ["BAJA","RANKING"]

encuentraTriviaAdecuada :: String -> Gateway -> Usuario -> Bool
encuentraTriviaAdecuada _ (CrearG _ _) _ = False
encuentraTriviaAdecuada texto (AgregarTrivia trivia gateway) usuario =
        ((segundaPalabra texto) `elem` (keywordsT trivia) &&
                (usuario `elem` (participantesT trivia)))
        || encuentraTriviaAdecuada texto gateway usuario

mensajeRanking :: String -> Gateway -> Usuario -> String
mensajeRanking texto gateway usuario = "Tu posicion es: " ++ 
        intToString (posicionEnT (dameTrivia (segundaPalabra texto) gateway) usuario)

dameTrivia :: String -> Gateway -> Trivia
dameTrivia keyword (AgregarTrivia trivia gateway)
        | keyword `elem` keywordsT (trivia) = trivia
        | otherwise = dameTrivia keyword gateway

gatewayBaja :: Gateway -> Usuario -> String -> Gateway
gatewayBaja (CrearG numero keywords) _ _ = CrearG numero keywords
gatewayBaja (AgregarTrivia trivia gateway) usuario texto
        | ((segundaPalabra texto) `elem` (keywordsT trivia)) =
                (AgregarTrivia (desregistrarJugadorT trivia usuario) gateway)
        | otherwise = AgregarTrivia trivia (gatewayBaja gateway usuario texto)
                                                                                                                 
-- Fin ProcesarComandoG -- 

-- ProcesarMensajeG -- 

procesarMensajeG :: Gateway -> Usuario -> SMS -> (Gateway,SMS)
procesarMensajeG gateway usuario sms | not(esKeyword (textoSMS sms) gateway) =
        (gateway, nuevoSMS usuario "No te entiendo")
                                     | otherwise =
        (nuevaGwConJugador (textoSMS sms) usuario gateway,
                respuestaAUsuario gateway usuario sms)

buscarTrivia :: SMS -> Gateway -> Trivia
buscarTrivia sms gateway = dameTrivia (damePalabra (textoSMS sms)) gateway

respuestaAUsuario :: Gateway -> Usuario -> SMS -> SMS
respuestaAUsuario gateway usuario sms = snd (componerTrivia
        (buscarTrivia sms gateway) usuario (textoSMS sms))
                                                                         
esKeyword :: Texto -> Gateway -> Bool
esKeyword texto (CrearG numero keywords) = False
esKeyword texto (AgregarTrivia trivia gateway) =
        (damePalabra texto) `elem` (keywordsT trivia) || esKeyword texto gateway

esNuevo :: Trivia -> Usuario -> Bool
esNuevo trivia usuario = not (elem usuario (participantesT trivia))  

nuevaGwConJugador :: Texto -> Usuario -> Gateway -> Gateway
nuevaGwConJugador _ _ (CrearG id keywords) = CrearG id keywords
nuevaGwConJugador texto usuario (AgregarTrivia trivia gateway) |
        (damePalabra texto) `elem` (keywordsT trivia) =
                AgregarTrivia (fst(componerTrivia trivia usuario texto)) gateway
                                                               |
        otherwise = AgregarTrivia trivia (nuevaGwConJugador texto usuario gateway)
                                                               
componerTrivia :: Trivia -> Usuario -> Texto -> (Trivia,SMS)
componerTrivia trivia usuario texto | esNuevo trivia usuario =
        registrarJugadorT trivia usuario texto
                                    | otherwise =
        procesarRespuestaT trivia usuario texto
                                                                                              
-- Fin ProcesarMensajeG -- 










-- SeAnotanEnTodasG -- 

seAnotanEnTodasG:: Gateway -> [Usuario]
seAnotanEnTodasG gateway = sacarRepetidos (participanEnTodas
        (ganadoresDeTodasLasTrivias gateway) gateway)

participanEnTodas:: [Usuario] -> Gateway -> [Usuario]
participanEnTodas [] _ = []
participanEnTodas (usuario:us) gateway | esParticipanteDeTodasLasTrivias usuario gateway =
        usuario : (participanEnTodas us gateway)
                                       | otherwise = participanEnTodas us gateway

esParticipanteDeTodasLasTrivias:: Usuario -> Gateway -> Bool
esParticipanteDeTodasLasTrivias usuario (CrearG numero keywords) = True
esParticipanteDeTodasLasTrivias usuario (AgregarTrivia trivia gateway) =
        usuario `elem` (participantesT trivia) &&
                (esParticipanteDeTodasLasTrivias usuario gateway)

ganadoresDeTodasLasTrivias:: Gateway -> [Usuario]
ganadoresDeTodasLasTrivias (CrearG numero keywords) = []
ganadoresDeTodasLasTrivias (AgregarTrivia trivia gateway) =
        (ganadoresT trivia) ++ (ganadoresDeTodasLasTrivias gateway)
                                                                                                                
-- Fin SeAnotanEnTodasG -- 
